package cn.xuexiyuan.springstudy.core.demo02.dao.impl;

import cn.xuexiyuan.springstudy.core.demo02.entity.Sequence;
import cn.xuexiyuan.springstudy.core.demo02.dao.SequenceDao;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 类被 @Component 注解修饰, 这样 Spring 就可以通过它创建 POJO 了。
 *
 * POJO 是在应用层中进行分类的。 在 Spring 中有三层： 持久化、服务与展示层。
 * @Component 是一个通用的注解，用于修饰 POJO 以便让 Spring 能够检测到， 而 @Repository、 @Service 与 @Controller 则是 @Component 的特化。
 * 它们针对具体的 POJO 层， 分别对应于持久化、服务与展示层。
 *
 * 如果不确定 POJO 的目的，你可以使用 @Component 注解来修改它。不过，在可能的情况下最好使用特化的注解，因为它们会根据 POJO 的目的提供额外的功能。（比如 @Repository 会将异常包装为DataAccessExceptions，
 * 这使得调试变得更加容易）。
 *
 *
 */
@Component("sequenceDao")
public class SequenceDaoImpl implements SequenceDao {

    private final Map<String, Sequence> sequences = new HashMap<>();
    private final Map<String, AtomicInteger> values = new HashMap<>();

    public SequenceDaoImpl(){
        sequences.put("it", new Sequence("IT", "30", "SMQK"));
        values.put("it", new AtomicInteger(10000));
    }

    @Override
    public Sequence getSequence(String sequenceId) {
        return sequences.get(sequenceId);
    }

    @Override
    public int getNextInt(String sequenceId) {
        return values.get(sequenceId).getAndIncrement();
    }
}
